/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package business;

import java.util.ArrayList;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.FlushModeType;
import javax.persistence.NoResultException;
import javax.persistence.Persistence;
import javax.persistence.Query;
import javax.servlet.http.HttpSession;
import javax.sql.DataSource;

/**
 *
 * @author ceu
 */
public class consultasBD {

    private EntityManagerFactory emf;
    private EntityManager em;
    public DataSource ds;

    public consultasBD() {
        this.ds = null;
    }

    public consultasBD(DataSource ds) {
        this.ds = ds;
    } //Constructor

    public void setDataSource(DataSource ds) {
        this.ds = ds;
    }

    public Alumno getAlumnoByCorreo(String correo) {

        emf = Persistence.createEntityManagerFactory("UAOProjectPU");
        em = emf.createEntityManager();
        em.setFlushMode(FlushModeType.AUTO);
        em.getTransaction().begin();
        Query n = em.createNamedQuery("Alumno.findByCorreouniversidad").setParameter("correouniversidad", correo);
        Alumno a = null;
        try {
            a = (Alumno) n.getSingleResult();
            em.close();
            return a;
        } catch (NoResultException nre) {
            em.close();
            return null;
        }

    }

    public Empleado getEmpleadoByCorreo(String correo) {

        emf = Persistence.createEntityManagerFactory("UAOProjectPU");
        em = emf.createEntityManager();
        em.setFlushMode(FlushModeType.AUTO);
        em.getTransaction().begin();
        Query n = em.createNamedQuery("Empleado.findByCorreouniversidad").setParameter("correouniversidad", correo);
        Empleado a = null;
        try {
            a = (Empleado) n.getSingleResult();
            em.close();
            return a;
        } catch (NoResultException nre) {
            em.close();
            return null;
        }

    }


   public Alojamiento buscarAlojamientoByStreetNumber(String calle, String numero, String ciudad){
        emf = Persistence.createEntityManagerFactory("UAOProjectPU");
        em = emf.createEntityManager();
        em.setFlushMode(FlushModeType.AUTO);
        em.getTransaction().begin();
        Query n = em.createNamedQuery("Alojamiento.buscarAlojamientoByStreetNumber").setParameter("calle", calle).setParameter("numero", numero).setParameter("ciudad", ciudad);
        Alojamiento h =new Alojamiento();
       try {
            h = (Alojamiento) n.getSingleResult();
            em.close();
            return h;
        } catch (NoResultException nre) {
            em.close();
            return null;
        }

   }


    


    public void persistirNuevoAlojamientoMerge(Alojamiento a) {
        emf = Persistence.createEntityManagerFactory("UAOProjectPU");
        em = emf.createEntityManager();
        em.setFlushMode(FlushModeType.AUTO);
        em.getTransaction().begin();
        Alojamiento upd = em.merge(a);

            em.persist(upd);
            em.getTransaction().commit();


        
        em.close();
   }

    public void persistirNuevoAlojamiento(Alojamiento a) {
        emf = Persistence.createEntityManagerFactory("UAOProjectPU");
        em = emf.createEntityManager();
        em.setFlushMode(FlushModeType.AUTO);
        em.getTransaction().begin();
        em.persist(a);
        em.getTransaction().commit();
        em.close();
   }


    public Contratoalumno buscarContratoVigente(List<Contratoalumno> contratos) {
        for (int i = 0; i < contratos.size(); i++) {
            if (contratos.get(i).getEstado().equals("vigente")) {
                return contratos.get(i);
            }
        }
        return null;
    }


    public ArrayList<Reserva> getAllReservas() {
        emf = Persistence.createEntityManagerFactory("UAOProjectPU");
        em = emf.createEntityManager();
        em.setFlushMode(FlushModeType.AUTO);
        em.getTransaction().begin();
        Query n = em.createNamedQuery("Reserva.findAllByEstado").setParameter("estado", "pendiente");
        ArrayList<Reserva> l = new ArrayList<Reserva>();
        try {
            n.setMaxResults(50);
            l=new ArrayList<Reserva>(n.getResultList());
            em.close();
            return l;
        } catch (NoResultException e) {
            em.close();
            return null;
        }
    }


    public Reserva getLastReserva(List<Reserva> reservas) {
        //     System.out.println("************************PIPIPPIPIPPI"+reservas);
        if (reservas != null && !reservas.isEmpty() && reservas.size() > 0) {
//           System.out.println("************************HE ENTRADO EN EL PUTO IF");
            return reservas.get(reservas.size() - 1);
        }
        return null;
    }

    public Habitacion getHabitacionByID(Integer id){
        emf = Persistence.createEntityManagerFactory("UAOProjectPU");
        em = emf.createEntityManager();
        em.setFlushMode(FlushModeType.AUTO);
        em.getTransaction().begin();
        Query n = em.createNamedQuery("Habitacion.findByID").setParameter("idhabitacion", id);

        Habitacion h =new Habitacion();
       try {
            h = (Habitacion) n.getSingleResult();
            em.close();
            return h;
        } catch (NoResultException nre) {
            em.close();
            return null;
        }
        
    }

    public void anularContrato (String idcontrato){

            //poner el contrato como finalizado y la habitacion como disponible
            emf = Persistence.createEntityManagerFactory("UAOProjectPU");
            em = emf.createEntityManager();
            em.setFlushMode(FlushModeType.AUTO);
            em.getTransaction().begin();
            Integer idres = Integer.parseInt(idcontrato);
            Query n = em.createNamedQuery("Contratoalumno.findByID").setParameter("idcontratoalumno", idres);
            Contratoalumno c = new Contratoalumno();
            try {
                c = (Contratoalumno) n.getSingleResult();
                c.setEstado("finalizado");
                Contratoalumno nuevoc = em.merge(c);
                em.persist(nuevoc);
                Integer idhab = c.getHabitacion().getIdhabitacion();
                Query n2 = em.createNamedQuery("Habitacion.findByID").setParameter("idhabitacion", idhab);
                Habitacion hab = new Habitacion();
                try {
                    hab = (Habitacion) n2.getSingleResult();
                    hab.setEstado("vacio");
                    Habitacion nuevahab = em.merge(hab);
                    em.persist(nuevahab);
                    em.getTransaction().commit();
                    em.close();
            } catch (NoResultException nre) {
                em.close();
                }

            } catch (NoResultException nre) {
                em.close();
            }


            //poner la habitacion como libre

    }


    public Reserva cambiarEstadoReserva(String id, String estado){

            //cambiar estado reserva, crear el contrato y poner la habitacion a libre

            emf = Persistence.createEntityManagerFactory("UAOProjectPU");
            em = emf.createEntityManager();
            em.setFlushMode(FlushModeType.AUTO);
            em.getTransaction().begin();
            Integer idres = Integer.parseInt(id);
            Query n = em.createNamedQuery("Reserva.findByID").setParameter("idreserva", idres);

            Reserva r = new Reserva();
            try {
                r = (Reserva) n.getSingleResult();
                r.setEstado(estado);
                Reserva nueva = em.merge(r);
                em.persist(nueva);

                //crear y persistir el nuevo contrato establecido
               // Contratoalumno c = new Contratoalumno(r.getAlumno(), null, null, r.getHabitacion(), "vigente");
                //em.persist(c);




                em.getTransaction().commit();
                em.close();
                return r;
            } catch (NoResultException nre) {
                em.close();
                return null;
            }

        }


    public void persistirReserva(Alumno a){
        emf = Persistence.createEntityManagerFactory("UAOProjectPU");
        em = emf.createEntityManager();
        em.setFlushMode(FlushModeType.AUTO);
        em.getTransaction().begin();


        Alumno upd = em.merge(a);
            em.persist(upd);
            em.getTransaction().commit();
            em.close();

    }


    public Alumno persistirContratoAlumno(Alumno a, Contratoalumno c){
        emf = Persistence.createEntityManagerFactory("UAOProjectPU");
        em = emf.createEntityManager();
        em.setFlushMode(FlushModeType.AUTO);
        em.getTransaction().begin();
        a.getContratoalumnos().add(c);
        Alumno upd = em.merge(a);
        em.persist(upd);

        Query n = em.createNamedQuery("Alumno.findByCorreouniversidad").setParameter("correouniversidad", a.getCorreouniversidad());
        Alumno al = (Alumno) n.getSingleResult();


        em.getTransaction().commit();
        em.close();
        return al;
    }


    public Reserva getReservaPendienteAlumno(Alumno alumno) {
        emf = Persistence.createEntityManagerFactory("UAOProjectPU");
        em = emf.createEntityManager();
        em.setFlushMode(FlushModeType.AUTO);
        em.getTransaction().begin();
        Query n = em.createNamedQuery("Reserva.findByAlumno").setParameter("alumno", alumno);

        List <Reserva> list = new ArrayList<Reserva>();
        Reserva r =new Reserva();
        try {
            list = (List <Reserva>) n.getResultList();
            em.close();
            r =(Reserva) list.get(list.size()-1);
            if(r.getEstado().equals("pendiente") || r.getEstado().equals("aceptada")){
                return r;
            }
            else{
                return null;
            }
        } catch (NoResultException nre) {
            em.close();
            return null;
        }


    }


    public void cambiaEstadoHabitacion (Habitacion h, String estado){
        emf = Persistence.createEntityManagerFactory("UAOProjectPU");
        em = emf.createEntityManager();
        em.setFlushMode(FlushModeType.AUTO);
        em.getTransaction().begin();
        h.setEstado(estado);
        em.merge(h);
        em.close();
    }
    
    
     public List<Habitacion> getEmptyRoomByStreetAndSmoke(String street, String smoke, String tipo) {
       
         emf = Persistence.createEntityManagerFactory("UAOProjectPU");
        em = emf.createEntityManager();
        em.setFlushMode(FlushModeType.AUTO);
        em.getTransaction().begin();
        Boolean f;
        if (smoke.equals("sifumador")) f=true;
        else f=false;
        
         try{
         List<Habitacion> Hdisponibles = (List<Habitacion>)em.createQuery("SELECT h from Habitacion h where h.estado=:estado"
                  )
                 .setParameter("estado", "vacio")
                 .getResultList();
         
          List<Habitacion> Hresultado = new ArrayList<Habitacion>();
         
         for (int i=0;i<Hdisponibles.size();i++){
             if ((Hdisponibles.get(i).getAlojamiento().getTipo().equals(tipo)) && (Hdisponibles.get(i).getAlojamiento().getCalle().equals(street)) && (Hdisponibles.get(i).getFumador().compareTo(f)==0) )
                 Hresultado.add(Hdisponibles.get(i));
         }
        
         return Hresultado;
         
         } catch (NoResultException nre) {
            em.close();
            return null;
        }
        
    }
    

    public List<Habitacion> getEmptyRoomByStreet(String street, String tipo) {
        
        emf = Persistence.createEntityManagerFactory("UAOProjectPU");
        em = emf.createEntityManager();
        em.setFlushMode(FlushModeType.AUTO);
        em.getTransaction().begin();
        System.out.println("En getEmptyRoomByStreet");
        System.out.println("street: "+street);
        System.out.println("tipo: "+tipo);
        
        try{
         List<Habitacion> Hdisponibles = (List<Habitacion>)em.createQuery("SELECT h from Habitacion h where h.estado=:estado")
                 .setParameter("estado", "vacio")
                 .getResultList();
          
         List<Habitacion> Hresultado = new ArrayList<Habitacion>();
            System.out.println("Hdisponibles.size: "+Hdisponibles.size());
         for (int i=0;i<Hdisponibles.size();i++){
             System.out.println("habitacion "+i+" tipo :"+ Hdisponibles.get(i).getAlojamiento().getTipo()+ "calle: "+Hdisponibles.get(i).getAlojamiento().getCalle());
             if ((Hdisponibles.get(i).getAlojamiento().getTipo().equals(tipo)) && (Hdisponibles.get(i).getAlojamiento().getCalle().equals(street)))
                 Hresultado.add(Hdisponibles.get(i));
         }
        
         System.out.println("Hresultado.size: "+Hresultado.size());
         return Hresultado;
        
         } catch (NoResultException nre) {
            em.close();
            return null;
        }
    }

    public List<Habitacion> getEmptyRoomByBarrio(String barrio,String tipo) {
        
        emf = Persistence.createEntityManagerFactory("UAOProjectPU");
        em = emf.createEntityManager();
        em.setFlushMode(FlushModeType.AUTO);
        em.getTransaction().begin();
        
        try{
          List<Habitacion> Hdisponibles = (List<Habitacion>)em.createQuery("SELECT h from Habitacion h where h.estado=:estado")
                 .setParameter("estado", "vacio")
                 .getResultList();
          
         List<Habitacion> Hresultado = new ArrayList<Habitacion>();
         
         for (int i=0;i<Hdisponibles.size();i++){
             if ((Hdisponibles.get(i).getAlojamiento().getTipo().equals(tipo)) && (Hdisponibles.get(i).getAlojamiento().getBarrio().equals(barrio)))
                 Hresultado.add(Hdisponibles.get(i));
         }
        
         return Hresultado;
        } catch (NoResultException nre) {
            em.close();
            return null;
        }
    }

    public List<Habitacion> getEmptyRoomByBarrioAndSmoke(String barrio, String smoker,String tipo) {
        
        emf = Persistence.createEntityManagerFactory("UAOProjectPU");
        em = emf.createEntityManager();
        em.setFlushMode(FlushModeType.AUTO);
        em.getTransaction().begin();
        Boolean f;
        if (smoker.equals("sifumador")) f=true;
        else f=false;
        
        try{
         List<Habitacion> Hdisponibles = (List<Habitacion>)em.createQuery("SELECT h from Habitacion h where h.estado=:estado"
                 )
                 .setParameter("estado", "vacio")
                 .getResultList();
         
          List<Habitacion> Hresultado = new ArrayList<Habitacion>();
         
         for (int i=0;i<Hdisponibles.size();i++){
             if ((Hdisponibles.get(i).getAlojamiento().getTipo().equals(tipo)) && (Hdisponibles.get(i).getAlojamiento().getBarrio().equals(barrio)) && (Hdisponibles.get(i).getFumador().compareTo(f)==0) )
                 Hresultado.add(Hdisponibles.get(i));
         }
        
         return Hresultado;
        } catch (NoResultException nre) {
            em.close();
            return null;
        }
    }

    public List<Habitacion> getEmptyRoomByCity(String ciudad,String tipo) {
     
        emf = Persistence.createEntityManagerFactory("UAOProjectPU");
        em = emf.createEntityManager();
        em.setFlushMode(FlushModeType.AUTO);
        em.getTransaction().begin();
        
        try{
         List<Habitacion> Hdisponibles = (List<Habitacion>)em.createQuery("SELECT h from Habitacion h where h.estado=:estado")
                 .setParameter("estado", "vacio")
                 .getResultList();
          
         List<Habitacion> Hresultado = new ArrayList<Habitacion>();
         
         for (int i=0;i<Hdisponibles.size();i++){
             if ((Hdisponibles.get(i).getAlojamiento().getTipo().equals(tipo)) && (Hdisponibles.get(i).getAlojamiento().getCiudad().equals(ciudad)))
                 Hresultado.add(Hdisponibles.get(i));
         }
        
         return Hresultado;
        } catch (NoResultException nre) {
            em.close();
            return null;
        }
    }
    

    public List<Habitacion> getEmptyRoomByCityAndSmoke(String ciudad, String smoker,String tipo) {
        
        emf = Persistence.createEntityManagerFactory("UAOProjectPU");
        em = emf.createEntityManager();
        em.setFlushMode(FlushModeType.AUTO);
        em.getTransaction().begin();
        Boolean f;
        if (smoker.equals("sifumador")) f=true;
        else f=false;
        
        try{
         List<Habitacion> Hdisponibles = (List<Habitacion>)em.createQuery("SELECT h from Habitacion h where h.estado=:estado"
                 )
                 .setParameter("estado", "vacio")
                 .getResultList();
         
          List<Habitacion> Hresultado = new ArrayList<Habitacion>();
         
         for (int i=0;i<Hdisponibles.size();i++){
             if ((Hdisponibles.get(i).getAlojamiento().getTipo().equals(tipo)) && (Hdisponibles.get(i).getAlojamiento().getCiudad().equals(ciudad)) && (Hdisponibles.get(i).getFumador().compareTo(f)==0) )
                 Hresultado.add(Hdisponibles.get(i));
         }
        
         return Hresultado;
         
        } catch (NoResultException nre) {
            em.close();
            return null;
        }
    }

    public List<Habitacion> getAllEmptyRoom(String tipo) {
        
        emf = Persistence.createEntityManagerFactory("UAOProjectPU");
        em = emf.createEntityManager();
        em.setFlushMode(FlushModeType.AUTO);
        em.getTransaction().begin();
        
        try{
         List<Habitacion>  Hdisponibles = (List<Habitacion>)em.createQuery("SELECT h from Habitacion h where h.estado=:estado")
                 .setParameter("estado", "vacio")
                 .getResultList();
         
         List<Habitacion> Hresultado = new ArrayList<Habitacion>();
         
         for (int i=0;i<Hdisponibles.size();i++){
             if (Hdisponibles.get(i).getAlojamiento().getTipo().equals(tipo))
                 Hresultado.add(Hdisponibles.get(i));
         }
        
         return Hresultado;
         
         } catch (NoResultException nre) {
            em.close();
            return null;
        }
    }

    
    public List<Habitacion> getEmptyRoomBySmoke(String smoker, String tipo) {
        
        emf = Persistence.createEntityManagerFactory("UAOProjectPU");
        em = emf.createEntityManager();
        em.setFlushMode(FlushModeType.AUTO);
        em.getTransaction().begin();
        
        Boolean f;
        if (smoker.equals("sifumador")) f=true;
        else f=false;
        
        try{
          List<Habitacion> Hdisponibles =  (List<Habitacion>)em.createQuery("SELECT h from Habitacion h where h.estado=:estado"
                  )
                 .setParameter("estado", "vacio")
                 .getResultList();
         
         List<Habitacion> Hresultado = new ArrayList<Habitacion>();
         
         for (int i=0;i<Hdisponibles.size();i++){
             if ((Hdisponibles.get(i).getAlojamiento().getTipo().equals(tipo)) && (Hdisponibles.get(i).getFumador().compareTo(f)==0) )
                 Hresultado.add(Hdisponibles.get(i));
         }
        
         return Hresultado;
         
         } catch (NoResultException nre) {
            em.close();
            return null;
        }
    }

    public Alumno getAlumno(Alumno a){
        emf = Persistence.createEntityManagerFactory("UAOProjectPU");
        em = emf.createEntityManager();
        em.setFlushMode(FlushModeType.AUTO);
        em.getTransaction().begin();
        Query n = em.createNamedQuery("Alumno.findByCorreouniversidad").setParameter("correouniversidad", a.getCorreouniversidad());
        Alumno alumno = (Alumno) n.getSingleResult();
        em.close();
        return alumno;
    }
  

}
